//
//  KZTableViewDataSourcePackage.swift
//  Fanrengame
//
//  Created by 朱凯 on 2018/4/25.
//  Copyright © 2018年 JooKey. All rights reserved.
//

import UIKit

// MARK: ------ 自定义UITableView数据源，简化代码结构，该数据源无法实现单元格高度自适应
/*
 如果要实现高度自定义，需要不实现高度的回调，并设置下面2个值
 table.rowHeight = UITableViewAutomaticDimension
 table.estimatedRowHeight = 100
 */
class KZTableViewDataSource: NSObject, UITableViewDataSource, UITableViewDelegate {
    
    /// 与数据源关联的table
    private weak var table: UITableView!
    
    /// table数据数组(二元数组,分别表示组和行)
    var items: [[Any]]?
    /// 头视图数据数组
    var headerItems: [Any]?

    /// 默认行高
    var cellHeight: CGFloat = 36
    /// cell配置器
    private var cellConfig: ((AnyObject, IndexPath, Any)->Void)!
    /// cell类
    private var cellClass: AnyClass! {
        didSet {
            table.register(self.cellClass, forCellReuseIdentifier: "cell")
        }
    }
    
    /// 默认组头高
    var headerHeight: CGFloat = 0
    /// 组头配置器
    private var headerConfig: ((AnyObject, Int, Any)->Void)?
    /// 组头类
    private var headerClass: AnyClass? {
        didSet {
            guard let headerClass = headerClass else {
                return
            }
            table.register(headerClass, forHeaderFooterViewReuseIdentifier: "header")
        }
    }
    
    /// 初始化
    init(table: UITableView) {
        super.init()
        self.table = table
    }
    /// 注册行配置
    func registerCell(cellClass: AnyClass, config: @escaping (AnyObject, IndexPath, Any)->Void) {
        self.cellClass = cellClass
        self.cellConfig = config
    }
    /// 注册组头配置
    func registerHeader(headerClass: AnyClass, config: @escaping (AnyObject, Int, Any)->Void) {
        self.headerClass = headerClass
        self.headerConfig = config
    }
    
    
    // MARK: ------ UITableViewDatasource
    func numberOfSections(in tableView: UITableView) -> Int {
        return items?.count ?? 0
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let itemsAtSection: [Any]? = items?[section]
        return itemsAtSection?.count ?? 0
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
        let itemsAtSection: [Any]? = items?[indexPath.section]
        cellConfig(cell!, indexPath, itemsAtSection![indexPath.row])
        return cell!
    }

    // 不常用
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return nil
    }
    func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
        return nil
    }
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return false
    }
    func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
        return false
    }


    // delegate
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return cellHeight
    }
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return headerHeight
    }
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "header")
        headerConfig?(header!, section, headerItems![section])
        return header
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        
    }
    
}
